import { Toast } from 'antd-mobile'
import axios, { AxiosError } from 'axios'
import { getToken, hasToken } from './storage'
import { history } from '@/utils/history'
import store from '@/store'
import { loginAction, logout, saveToken } from '@/store/actions/login'

// 基地址
const baseURL = 'http://geek.itheima.net/v1_0/'

// 创建请求对象
const instance = axios.create({
  baseURL,
  // 不限制超时时间
  // timeout: 5000,
})

// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    console.log('request-拦截器')
    if (hasToken()) {
      config.headers!.Authorization = `Bearer ${getToken().token}`
    }
    // 在发送请求之前做些什么
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    console.log('response-拦截器')

    // 对响应数据做点什么
    return response
  },
  async function (error: AxiosError) {
    // 这个错误一般是服务器异常
    if (!error.response) {
      // 提示用户
      Toast.show('服务器异常')
      // 服务器异常
      return Promise.reject(error)
    }
    // 判断状态码
    console.dir(error)
    if (error.response.status === 401) {
      // token失效
      // 判断是否有refresh_token
      const token = getToken()
      // 没有refresh_token
      if (!token.refresh_token) {
        // 提示并去登录页
        Toast.show({
          content: '请重新登录',
        })
        // 清除token
        store.dispatch(logout())
        history.replace('/login', { from: history.location.pathname })
        return Promise.reject(error)
      }
      // 有refresh_token
      if (token.refresh_token) {
        try {
          // 换取新的token
          const res = await axios({
            url: '/authorizations',
            method: 'put',
            baseURL,
            headers: {
              Authorization: `Bearer ${token.refresh_token}`,
            },
          })
          // 更新token 缓存 redux
          store.dispatch(
            saveToken({
              token: res.data.data.token,
              refresh_token: token.refresh_token,
            })
          )
          // 继续上一次的请求
          return instance(error.config)
        } catch (error) {
          // refresh_token有误
          // 提示并去登录页
          Toast.show({
            content: '请重新登录',
          })
          // 清除token
          store.dispatch(logout())
          history.replace('/login', { from: history.location.pathname })
          return Promise.reject(error)
        }
      }
    }

    Toast.show(error.response.data.message)
    // 对响应错误做点什么
    return Promise.reject(error)
  }
)

// 暴露出去
export default instance
